/**
 * @desc axios请求统一配置和处理
 */

import Vue from "vue";
import qs from "qs";
import axios from "axios";
import { Message } from "element-ui";
import Utils from "@/store/utils.js";

const options = {
  timeout: 90000,
  // 发送请求时带上cookie
  withCredentials: true,
  //设置请求头
  // headers: { 'content-type':'application/json;charset=UTF-8'},
  headers: { "content-type": "application/x-www-form-urlencoded" }
};
const Axios = axios.create(options);

// request请求拦截处理
Axios.interceptors.request.use(
  config => {
    // 给所有get请求加时间戳
    if (config.method === "get") {
      if (config.params) {
        config.params.t = Date.now();
      } else {
        config.params = {
          t: Date.now()
        };
      }
    } else {
      // config.headers = {
      //   "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
      //   // "Content-Type": "application/json;charset=UTF-8"
      // };

      // 根据接口判断是否要加密，加密的更改请求头
      var urlNow = config.url.split("/smxc")[1];
      var urlList = [
        "/county_village/xxc/list" // 县乡村管理
      ];
      var aurlSelect = urlList.indexOf(urlNow);
      if (aurlSelect > -1) {
        // console.log(urlNow, "--加密");
        config.headers = {
          "Content-Type": "application/json;charset=UTF-8"
        };
        var aesDatas = {
          aesKey: qs.parse(config.data),
          sign: "w"
        };
        var is_datas = Utils.encrypt(JSON.stringify(aesDatas));
        var aes_datas = encodeURI(is_datas);
        config.data = aes_datas;
      } else {
        // console.log(urlNow, "--不加密");
        config.headers = {
          "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
        };
      }

      // 判断是否存在token,如果存在将每个页面header添加token   config.headers.common[]
      if (sessionStorage.getItem("token")) {
        config.headers["token"] = sessionStorage.getItem("token");
      }

      // // AES加密
      // if (config.data != "") {
      //   var aesDatas = {
      //     aesKey: JSON.parse(config.data),
      //     sign: "w"
      //   };
      //   var is_datas = Utils.encrypt(JSON.stringify(aesDatas));
      // } else {
      //   var aesDatas = {
      //     aesKey: config.data,
      //     sign: "w"
      //   };
      //   var is_datas = Utils.encrypt(JSON.stringify(aesDatas));
      // }
      // config.data = is_datas;
    }

    return config;
  },
  err =>
    // Do something with request error
    Promise.reject(err)
);

// response响应拦截处理
Axios.interceptors.response.use(
  res => {
    // 请求成功，但是操作不成功时显示后端返回的错误信息
    // 请求成功条件根据接口规范来设置
    // if (!res.data.code) {
    //   // 统一错误处理
    //   // Message.error(res.data.message || '接口请求出错了！')
    // }

    // 获取路径
    // let to_path = sessionStorage.getItem("to_path");
    // token失效错误跳转登录页
    if (res.data.result == 1001 || res.data.result == 1002) {
      // //只要不是unity网页的都跳转到登录页
      // if (to_path.indexOf("/unity") == -1) {
      Message.error(res.data.msg);
      setTimeout(function() {
        window.location.href = "/";
      }, 1000);
      return;
      // }
    }

    // 根据接口判断是否要加密，加密的解密
    var urlNow = res.config.url.split("/smxc")[1];
    var urlList = [
      "/county_village/xxc/list" // 县乡村管理
    ];
    var aurlSelect = urlList.indexOf(urlNow);
    if (aurlSelect > -1) {
      // console.log(urlNow, "--解密");
      // AES解密
      var response = JSON.parse(Utils.decrypt(res.data.data || null));
      res.data.data = response;
    } else {
      // console.log(urlNow, "--不解密");
    }

    // 统一错误处理
    if (res.data.result != 0) {
      Message.error(res.data.msg);
    }

    // 返回接口数据
    return res.data;
  },
  err => {
    console.error(err);
    if (err && err.response) {
      // 统一错误处理
      // Message.error(err.message || '接口请求出错了！')
      Message.error("数据请求失败，code = " + err.response.status);
    } else if (Axios.isCancel(err)) {
      // 处理请求被手动取消情况
      console.log("请求被取消");
    } else {
      // 处理网络访问出错的情况
      Message.error("连接到服务器失败！");
    }

    return Promise.reject(err);
  }
);

// 将axios实例挂载到vue，方便需要时使用
// 不过推荐统一使用api.js来定义所有接口，方便统一管理维护
Vue.prototype.$axios = Axios;

export default Axios;
